/**
 * 网络请求封装模块
 * 提供统一的API请求接口，处理请求拦截、响应拦截、错误处理等
 */

// 导入配置文件
const { API_CONFIG, STORAGE_CONFIG } = require('./config');

/**
 * 发送请求的核心函数
 * @param {Object} options - 请求配置
 * @param {string} options.url - 请求路径
 * @param {string} options.method - 请求方法
 * @param {Object} options.data - 请求数据
 * @param {Object} options.header - 请求头
 * @param {boolean} options.loading - 是否显示加载提示
 * @param {Function} options.success - 成功回调
 * @param {Function} options.fail - 失败回调
 * @param {Function} options.complete - 完成回调
 * @returns {Promise} 返回Promise对象
 */
const request = (options = {}) => {
  // 默认显示加载提示
  if (options.loading !== false && API_CONFIG.SHOW_LOADING) {
    wx.showLoading({
      title: options.loadingText || API_CONFIG.LOADING_TEXT,
      mask: true
    });
  }

  // 构建完整URL
  const url = options.url.startsWith('http') ? options.url : `${API_CONFIG.BASE_URL}${options.url}`;
  
  // 获取token
  const token = wx.getStorageSync(STORAGE_CONFIG.TOKEN_KEY);
  
  // 构建请求头
  const header = {
    'Content-Type': API_CONFIG.CONTENT_TYPE,
    ...options.header
  };
  
  // 如果有token，添加到请求头
  if (token) {
    header['Authorization'] = `Bearer ${token}`;
  }
  
  // 返回Promise
  return new Promise((resolve, reject) => {
    wx.request({
      url,
      method: options.method || 'GET',
      data: options.data || {},
      header,
      timeout: options.timeout || API_CONFIG.TIMEOUT,
      success: (res) => {
        // 请求成功
        if (res.statusCode >= 200 && res.statusCode < 300) {
          // 调用成功回调
          if (typeof options.success === 'function') {
            options.success(res.data);
          }
          resolve(res.data);
        } else if (res.statusCode === 401) {
          // 未授权，需要重新登录
          const app = getApp();
          if (app && typeof app.redirectToLogin === 'function') {
            app.redirectToLogin();
          } else {
            wx.redirectTo({
              url: '/pages/login/login'
            });
          }
          reject(res);
        } else {
          // 其他错误
          wx.showToast({
            title: res.data.message || '请求失败',
            icon: 'none'
          });
          // 调用失败回调
          if (typeof options.fail === 'function') {
            options.fail(res);
          }
          reject(res);
        }
      },
      fail: (err) => {
        // 网络错误
        wx.showToast({
          title: '网络异常，请检查网络设置',
          icon: 'none'
        });
        // 调用失败回调
        if (typeof options.fail === 'function') {
          options.fail(err);
        }
        reject(err);
      },
      complete: () => {
        // 隐藏加载提示
        if (options.loading !== false) {
          wx.hideLoading();
        }
        // 调用完成回调
        if (typeof options.complete === 'function') {
          options.complete();
        }
      }
    });
  });
};

/**
 * GET请求
 * @param {string} url - 请求路径
 * @param {Object} data - 请求参数
 * @param {Object} options - 其他配置
 * @returns {Promise} 返回Promise对象
 */
const get = (url, data = {}, options = {}) => {
  return request({
    url,
    method: 'GET',
    data,
    ...options
  });
};

/**
 * POST请求
 * @param {string} url - 请求路径
 * @param {Object} data - 请求数据
 * @param {Object} options - 其他配置
 * @returns {Promise} 返回Promise对象
 */
const post = (url, data = {}, options = {}) => {
  return request({
    url,
    method: 'POST',
    data,
    ...options
  });
};

/**
 * PUT请求
 * @param {string} url - 请求路径
 * @param {Object} data - 请求数据
 * @param {Object} options - 其他配置
 * @returns {Promise} 返回Promise对象
 */
const put = (url, data = {}, options = {}) => {
  return request({
    url,
    method: 'PUT',
    data,
    ...options
  });
};

/**
 * DELETE请求
 * @param {string} url - 请求路径
 * @param {Object} data - 请求数据
 * @param {Object} options - 其他配置
 * @returns {Promise} 返回Promise对象
 */
const del = (url, data = {}, options = {}) => {
  return request({
    url,
    method: 'DELETE',
    data,
    ...options
  });
};

// 导出接口
module.exports = {
  request,
  get,
  post,
  put,
  delete: del
};